package com.tinet.trainee.mb;

import java.io.Serializable;
import java.util.List;
import java.util.ResourceBundle;

import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import org.primefaces.context.RequestContext;


import com.tinet.trainee.bean.UsuarioBean;

import cl.tinet.trainee.tarea6.Usuario;
import cl.tinet.trainee.tarea6.exception.PruebaException;

/**
 * Nombre del Managed Bean.
 * 
 * @author Naht-Sams
 * 
 */
@ManagedBean(name = "UsuarioMB")
@SessionScoped
public class UsuarioMB implements Serializable {
	/**
	 * Objeto de instancia usuario.
	 */
	protected Usuario usuario;
	/**
	 * Contendra la lista de usuarios que se encuentren en la base de datos.
	 */
	protected List<Usuario> usuarios;
	/**
	 * Variable
	 */
	private String password2;
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	/**
	 * Variable que contendra el mensaje que se desea mostrar en la alerta.
	 */
	protected String msgError;
	/**
	 * 
	 */
	@EJB(mappedName = "UsuarioBean", name = "UsuarioBean")
	private transient UsuarioBean bean;

	/**
	 * Recivi los datos de un usuario, luego se procede hacer una busqueda
	 * dentoro de la BD, si esque lo encuentra lo recive una exception la cual
	 * envia un mensaje de error. En el caso contrario se agrega el dato en la
	 * BD.
	 * 
	 * @return Redirecciono a la pagina principal.
	 * @throws PruebaException
	 */
	public void crearUsuario() throws PruebaException {
		try {
			bean.buscarUsuarioAgregado(this.usuario);
		} catch (PruebaException e) {
			// e.printStackTrace();
			processErrorCodes(e);
			this.msgError = "Nombre de usuario ya existe.";
			saveMessage(this.msgError);
			//return "crearUsuario?faces-redirect=true";
		}
		bean.agregarUsuarioDao(this.usuario);
		this.msgError = "Usuario Ingresado";
		saveMessage(this.msgError);
		this.usuarios = null;
		RequestContext.getCurrentInstance().execute("dEditar.hide()");
		desplegarUsuarios();
	//	return "main?faces-redirect=true";
	}

	/**
	 * Buscar los datos del usuario que se este intentando eliminar.
	 * 
	 * @param usuarioRecivido
	 *            Datos del usuario recivido.
	 * @return Devuelve la direccion luego de encontrar el usuario.
	 */
	public String buscarEliminarUsuario(Usuario usuarioRecivido) {
		this.usuario = usuarioRecivido;
		return "eliminarDatosUsuario";
	}

	/**
	 * Proceder a eliminar un usuario de la base de datos. Validando que la
	 * password ingresada sea igual.
	 * 
	 * @return Devuelve la redireccion de la pagina.
	 */
	public String eliminarUsuario() {
		bean.eliminarUsuarioDao(this.usuario);
		this.usuarios = null;
		saveMessage("Usuario Eliminado");
		return "main?faces-redirect=true";

		/*
		 * Eliminar un usuario pidiendo que ingrese la clave correspondiente 
		 * if (this.usuario.getPassword().equals(this.password2)) {
		 * bean.eliminarUsuarioDao(this.usuario); this.usuarios = null;
		 * saveMessage("Usuario ELiminado"); return "main?faces-redirect=true";
		 * } else { saveMessage("Password Invalidas"); return
		 * "eliminarDatosUsuario?faces-redirect=true"; }
		 */
	}

	/**
	 * Buscar los datos de un usuario que se desea modificar.
	 * 
	 * @param usuarioRecivido
	 *            Datos del usuario seleccionado
	 * @return Devuelve una url para redireccionar.
	 */
	public String buscarModificarUsuario(Usuario usuarioRecivido) {
		this.usuario = usuarioRecivido;
		return "modificarDatosUsuario";
	}

	/**
	 * Proceder a modificar los datos del usuario. Luego dejo el objeto que se
	 * encuentra en session vacio.
	 * 
	 * @return Redirecciono a la pagina principal.
	 */
	public String modificarUsuario() {
		bean.modificarUsuarioDao(this.usuario);
		this.usuarios = null;
		saveMessage("Usuario Modificado");
		return "main?faces-redirect=true";

	}

	/**
	 * Metodo que se utiliza dentro del MB para devolver un usuario buscado
	 * dentro de la BD.
	 * 
	 * @return un objeto usuario.
	 */
	public Usuario buscarUsuario() {
		Usuario usuario = new Usuario();
		usuario = bean.buscarUsuarioDao(this.usuario);
		return usuario;
	}

	/**
	 * Buscar la lista completo e usuarios y dejalos en una lista.
	 */
	public void desplegarUsuarios() {
		Usuario usuario = new Usuario();
		this.usuarios = bean.buscarUsuarios(usuario);
		if (this.usuarios.isEmpty()) {
			this.msgError = "No usuarios registrados.";
			saveMessage(this.msgError);
		}
	}

	/**
	 * Growl
	 * 
	 * @param msg
	 *            Se entrega el string de msg.
	 */
	public static void saveMessage(String msg) {
		RequestContext.getCurrentInstance().update("u");
		FacesContext context = FacesContext.getCurrentInstance();
		context.getExternalContext().getFlash().setKeepMessages(true);
		context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Alerta", "" + msg));
	}

	/**
	 * Redireccionamiento a la pagina crearUsuario.xhtml
	 * 
	 * @return
	 */
	public String redireccionarCrearUsuario() {
		if (this.usuario != null) {
			this.usuario = new Usuario();
		}
		return "crearUsuario";
	}

	/**
	 * Metodo que se usa cuando se obtiene una exception.
	 * 
	 * @param e
	 *            Codigo del error.
	 * @return Devuelve un string con el codigo del error.
	 * @throws PruebaException
	 */
	private static String processErrorCodes(PruebaException e)
			throws PruebaException {
		String tipoError = e.getErrorCode();
		if (tipoError.equals("Usuario Registrado")) {
			System.out.println(e.getErrorCode());
			tipoError = "Usuario ya registrado";
		}
		return tipoError;

	}
	
	public void guardar() {
		System.out.println(this.usuario);
		System.out.println("entro");
		// do somethig.
		FacesContext context = FacesContext.getCurrentInstance();
		ResourceBundle bundleMsg = ResourceBundle.getBundle("messages", context
				.getViewRoot().getLocale());
		ResourceBundle bundleLbl = ResourceBundle.getBundle("labels", context
				.getViewRoot().getLocale());
		context.addMessage("gfMessages",
				new FacesMessage(bundleLbl.getString("general.btn.editar"),
						bundleMsg.getString("usuario.modificado")));
		RequestContext.getCurrentInstance().execute("dEditar.hide()");
	}	

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public UsuarioMB() {
		if (usuario == null) {
			usuario = new Usuario();
		}
	}

	public List<Usuario> getUsuarios() {
		return usuarios;
	}

	public void setUsuarios(List<Usuario> usuarios) {
		this.usuarios = usuarios;
	}

	public String getMsgError() {
		return msgError;
	}

	public void setMsgError(String msgError) {
		this.msgError = msgError;
	}

	public String getPassword2() {
		return password2;
	}

	public void setPassword2(String password2) {
		this.password2 = password2;
	}
}
